The problem is actually your test - you create a new Product (p1) and attach it to the session by calling Save, which will associate p1 with the session, so anytime you retrieve that product from the same session, it will return the same instance. This means that when you do session.QueryOver().List(), that list will contain the exact same instance of p1 - it will not create a new instance and populate it from the database.
You have 2 options: 1) Add your Product_i18n instances to the p1 dictionary explicitly 2) Flush and close the session before retrieving the products in a new session
I would suggest doing both for your test, the first option to maintain consistency in your code, and the second, to test whether other sessions retrieve the data correctly.