// create an object of a known type
var someObject = Activator.CreateInstance(derivedClassType);
// get the base class of the known type
var baseType = derivedClassType.BaseType;
// create a type of a generic list
Type openListType = typeof(List<>);
// set the item type of the generic list type to the base stype
Type baseTypeListType = openListType.MakeGenericType(baseType);
// create an instance of the list
dynamic baseTypeList = Activator.CreateInstance(baseTypeListType);
// add
baseTypeList.Add(someObject);
The use of dynamic
allows you to NOT use the actual base type in your code and saves you from the hassle of using reflection but you are in danger of violating assumptions such as "I am sure that all these types derive from the same base class so I won't check for that."