Наверно вы забыли у самого Treeview установить itemssource.
После установки в ItemsSource всех контрактов у вас они отобразятся, и у каждого будут отображены продукты из свойства product.
<TreeView>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Path=product}">
<TextBlock Text="{Binding} />
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
Таким образом у вас в Treeview будут отображены и контракты и продукты.
Если вы хотите разные шаблоны для отображения каждого из объектов их нужно выбирать через templateselector или проще без указания TreeView.ItemTemplate в ресурсах задать два типизированных шаблона, что-то типа:
<HierarchicalDataTemplate DataType="{x:type l:product}">...
Что касается динамической подгрузки, то по-умолчанию TreeView загружает данные целиком. И поэтому у вас прогрузятся всё что будет отражено. Если вы хотите динамическую загрузку - читайте про виртуализацию. применительно к Treeview.