When specializing generic classes you should inherit from them:
TTest = class;
TTest = cass(specialize TFPGList<TObject>); // Works
This way the compiler knows that the resulting type is indeed an instance of a class.
There are some other cases where direct specialization can lead to some problems. For example partial specialization:
generic TTest<T, U> = class(TObject);
generic TTestInt<U> = class(specialize TTest<Integer, U>); // Works
generic TTestInt<U> = specialize TTest<Integer, U>; // Doesn't
This is why you typically see the syntax "class(specialize ...);", it avoids some of the limitations FPC has for generics