> var routines = new IRoutine<T>[] {ClassA, ClassB}; // ※
元ソースが文法的に不正確である点はさておき、 var t0 = typeof(IRoutine); var t1 = typeof(IRoutine<>); var t2 = typeof(IRoutine<ClassA>); var t3 = typeof(ClassA); において、 t0.IsAssignableFrom(*) は、t0〜t3 いずれに対しても true t1.IsAssignableFrom(*) は、t1 自身以外はすべて false t2.IsAssignableFrom(*) は、t0〜t1 は false、t2 自身と t3 は true t3.IsAssignableFrom(*) は、t3 自身以外はすべて false という関係性を持ちます。
ゆえに今回の型定義の場合、書くとしても var routines = new IRoutine[] { new ClassA(), new ClassB() }; foreach (dynamic routine in routines) { routine.Parent = afro; } とするしかないでしょう。
ただしこの場合、公開された class ClassA : IRoutine<ClassA> { public ClassA Parent { set; get; } } のような実装が対象であり、明示実装された class ClassA : IRoutine<ClassA> { ClassA IRoutine<ClassA>.Parent { set; get; } } なクラスに対しては使えません。