After a few hours of hacking NHibernate I found the compromised solution of how to keep domain layer classes isolated from infrastructure layer. Only one 'victim' here is the point #1 in the list below:
1) I have introduced the base class DomainObject for all persistable entities in domain with only one private field:
private IDictionary _infrastructureProperties = new Dictionary<object, object>();
2) Added the following section in the class mapping:
<dynamic-component name='_infrastructureProperties' access='field'>
<property name='CreateBy' column='CreatedBy' />
<property name='CreateDate' column='CreatedDate' />
</dynamic-component>
3) Implemented a Interceptor which sets these properties values.
4) Optional. Also we could implement a kind settings with configuration of what 'role' every class is playing in the application and then to work with role specific properties in the Interceptor. E.g. this config may state that Product is TenantScopeObject and the interceptor will set the property named TenantID in value of current tenant identity is logged in the system.