Even without using reflection, you won't be able to cast a List<Person> to a List<object>, because that would let you break the list. Consider what would happen if this cast was allowed:
List<Person> onlyContainsPeople = new List<Person>();
List<object> containsAnyObject = (List<object>)onlyContainsPeople;
containsAnyObject.Add(new Hippopotamus()); // <-- Not a Person!
Person thePerson = onlyContainsnPeople[0];
You now have a list which is guaranteed to only contain Person objects, but the only object in the list is not a Person object. Either the line which adds the item to the list would have to throw an exception, or the line which retrieves the item from the list would have to throw an exception. Neither exception would be obvious or expected. There are a few generic interfaces and delegates which, in .NET 4.0 or higher, are declared as covariant or contravariant, which will allow something similar to what you're trying to do:
List<Person> onlyContainsPeople = new List<Person>();
IEnumerable<object> containsAnyObject = onlyContainsPeople;
Generic covariance only works for read-only interfaces/delegates - the generic type parameter is only ever returned, never passed in. Contravariance only works when the type parameter is only ever passed in, never returned. See Covariance and Contravariance in Generics[^] on MSDN for more information.
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer