The problem is you have two instances of the NavigationPane for each expander - one that you create through code and add to the ContainerItems property, and one that's declared in XAML. You don't have a binding for the NavigationPaneModel property in the XAML, so that property doesn't propagate from the ContainerItems instance to the XAML instance. If you add a binding, then the property won't be null:
Alternatively, remove the ListBox.ItemTemplate so that the list displays the items created in code. You can use a style to set the additional properties:
<Setter Property="BorderBrush" Value="Orange" />
<Setter Property="BorderThickness" Value="3" />
<Setter Property="Background" Value="Red" />
<Setter Property="Margin" Value="0,0,0,1" />
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer