Mscorlib содержит как собственный, так и управляемый код.
Среди прочего, он содержит реализацию System.Object, которая всегда должна присутствовать, чтобы все работало.
Он отличается тем, что является единственной сборкой, которую CLR требует загружать внутри каждого управляемого процесса.
Изначально многие «необязательные» вещи (вещи, которые технически не требуются для запуска приложения) были помещены в mscorlib, потому что это были вещи, которые с большой вероятностью будут использоваться всеми. Это включает в себя такие вещи, как HashTable и List.
Это дало мощный импульс. Если все захотят что-то использовать, то имеет смысл поместить это в сборку, которую все должны загрузить. Тогда вам не нужно тратить время на сборку и сборку различных сборок.
Материал в system.dll был практически всем, что не было «достойно» включения в mscorlib.
Эта тенденция, однако, начинает меняться. CLR прилагает усилия для уменьшения размера mscorlib. Например, для Silverlight было удалено много вещей (для уменьшения размера загрузки).
Я думаю, что они могут делать больше такого рода вещей для V4 (и более поздних версий), но я не уверен в деталях.