Why do I have to create a contact list for the contacts? I know I could pool the lists but can they not be automatically stored in an array and accessed that way?
The internal representation depends on the type of pair. If you wanted, you could do some annoying work to identify the specific type, and then access that type's unique representation without having to deal with the extra list. The purpose of the method is to allow you to ignore how the contacts are managed internally, so that the fact that it may have to traverse a hierarchy or collect from multiple manifolds is transparent.
One thing I've toyed with is creating a semi-enumerator that would allow you to go through the list of contacts without explicitly consolidating them, either using IEnumerable or just providing interpreted indexing. This might make it in eventually.
Are the contacts ordered by time of collision? There's no 't0' property to differentiate between them otherwise.
Contacts have no time of collision; just position, normal, depth, and ID. The ID is sometimes used to determine the feature from which the contact originated internally.
A CollisionInformationPairHandler (which owns the contact) does have a 'TimeOfImpact' property, but I don't think it is what you are looking for. TimeOfImpact is the amount of a frame's motion that can be completed before a CCD-blocked collision. If neither object in a pair is continuous, then the TimeOfImpact will just be 1.
If you'd like to know the age of a collision, you'll have to do it using events.