So the problem here is that two different generic specializations are completely different types, example:
type
generic TTestRec<T> = record
value: T;
end;
TCharRec = specialize TTestRec<Char>;
TIntRec = specialize TTestRec<Integer>;
TCharRec here is a record that contains only a single char, therefore sizeof(TCharRec) = 1. TIntRec is a record that contains a single integer, therefore sizeof(TIntRec) = 4.
A list can not work with these different types, because it needs to know which element requires how much space.
While you are working with classes and not records, the size might not be an issue, but I think this example is the best way to show my point, this is not inheritence, two different generic specializations are simply two completely different types