System.Object является базовым для System.ValueType потому, что C# скрывает от вам процесс boxing-а значений value-типов в ссылочные обертки.
Где выделяется память для ссылочных типов и типов-значений спецификацией не оговаривается (в текущих реализациях типы-значения иногда (!) выделяются на стеке, но могут быть и на куче, если являются членами ссылочных типов (массивы, другие классы, и т.д.). Для вас важно лишь знать логику поведения: как присваиваются и передаются в функции значения reference и value-типов, остальное - детали реализации.
Довольно важная для понимая статья:
blogs.msdn.com/b/ericlippert/archive/2010/09/30/th...