Mscorlib contiene tanto código nativo como código administrado.
Entre otras cosas, contiene la implementación de System.Object, que siempre debe estar presente para que todo funcione.
Tiene la distinción de ser el único conjunto que el CLR requiere cargar dentro de cada proceso gestionado.
Originalmente, una gran cantidad de cosas "opcionales" (cosas que técnicamente no son necesarias para ejecutar una aplicación) se pusieron en mscorlib porque eran cosas que muy probablemente fueran utilizadas por todos. Esto incluye cosas como HashTable y List.
Esto dio un impulso de perf. Si todo el mundo va a querer usar algo, entonces tiene sentido colocarlo dentro del ensamblaje que todo el mundo tiene que cargar. Entonces no tiene que perder el tiempo y enlazar un montón de conjuntos diferentes.
Las cosas en system.dll eran básicamente todo lo que no era "digno" de ser incluido en mscorlib.
Esta tendencia, sin embargo, está empezando a revertirse. El CLR está haciendo esfuerzos para reducir el tamaño de mscorlib. Se eliminaron muchas cosas para Silverlight, por ejemplo (para reducir el tamaño de descarga).
Creo que podrían estar haciendo más de este tipo de cosas para V4 (y versiones posteriores), pero no estoy seguro de los detalles.
Esto es algo así como una selección de detalles, pero como menciona @Justin Van Patten, mscorlib.dll no contiene ningún código nativo. En su lugar, tiene métodos externos anotados con '[MethodImpl (MethodImplOptions.InternalCall)]' que llaman al CLR. Si se navega por las fuentes SSCLI, puede ver estos métodos CLR exportados para el consumo de mscorlib. – codekaizen
Técnicamente, contiene ALGUNOS nodos nativos (el trozo de msdos en el encabezado PE) pero generalmente tiene razón. Edité la publicación para reflejar eso. –