Можно использовать Castle (среди прочего, у вас есть выбор, вы также можете использовать LinFu, Spring.NET, ...) для создания динамических прокси ваших сущностей.
По умолчанию NHibernate использует динамические прокси для представления ваших сущностей; тем самым он может вернуть вам объект при извлечении некоторой сущности из БД без заполнения всех свойств. Используя динамический прокси, он будет заполнять сущность только после того, как вы действительно обратитесь к свойству.
(Так что это какая-то ленивая загрузка; не путать с ленивой загрузкой коллекций / ассоциаций).
Это поведение является причиной, по которой NHibernate хочет, чтобы вы создавали каждое свойство как виртуальное по умолчанию: NHibernate создаст новый класс с помощью этого прокси-провайдера Castle (или LinFu, ...), который наследуется от вашего объекта, и переопределит все свойства, чтобы он мог «внедрить» код, необходимый для извлечения необходимых данных из БД.
Вы можете отключить это поведение, указав 'lazy = false' в отображении вашей сущности. (Хотя я думаю, что даже если вы отключите эту функцию, NHibernate все равно потребует использования одной из прокси-фабрик).