A list is a list of some templated objects. You instantiate a list of int objects with:
list<int> mylist;
This list now 'knows' it will be managing int objects.
One of the list methods is push_back() wich adds objects of the templated object type to the end of the list.
You instantiate a list of KeyValuePair objects with:
list<KeyValuePair<T>> mylist;
This second list is for managing KeyValuePair objects
Now if you try to add int objects to a list of KeyValuePair objects, this will fail because this list is a list of KeyValuePair objects, not int objects.