where T: GridCore means that T is a GridCore , i.e. GridCore is the base type or interface of T
But your list is List<T> , that is, a list of T and T may be a derived class of GridCore .
Suppose T is DerivedGridCore and has an int X field, then should GridCore have an int X field?
Unless you explicitly convert the type (or an implicit statement there), the compiler will not make this assumption because this envelope is not guaranteed.
For more intuitive thinking, a Girafe is Animal , but Animal may not necessarily be just Girafe ; a Tirget is either Animal .
source share