C # не позволяет этого, потому что все его классы основаны на метаданных. CLR (не C #) запрещает добавление полей к метаданным во время выполнения (1). Это единственный способ, с помощью которого C # может добавить поле в runitme.
Это не похоже на динамические языки, такие как IronPython, которые по существу не имеют конкретных классов метаданных. Они имеют более динамичные структуры, которые могут быть изменены во время выполнения. Я считаю, что IronPython просто хранит свои элементы (поля и методы) в том, что составляет хеш-таблицу, которую можно легко изменить во время выполнения.
В C # 3.0 ваш лучший ресурс - использовать Reflection.Emit. Но это создаст совершенно новый класс по сравнению с изменением существующего.
(1) Существуют определенные API, такие как API профилирования или ENC, которые позволяют это, но я не уверен, расширяются ли их возможности для добавления полей.