If you're going to have different data templates in the list box based on type you should do something like this:
<listbox itemssource="{Binding Items, RelativeSource={RelativeSource TemplatedParent}}">
<listbox.resources>
<datatemplate datatype="{x:Type viewModels:Person}">
...
</datatemplate>
<datatemplate datatype="{x:Type viewModels:OtherPossibleItemType}">
...
</datatemplate>
</listbox.resources>
</listbox>
That way whatever you're displaying will have it's appropriate display based on type and you don't have to add unnecessary metadata. This is also the way WPF is intended to be used.
Of course if your objects are coming from higher level assemblies where it's not appropriate for this scoped ListBox to determine the template, they can be defined in any resource dictionary higher in the visual tree. And even more importantly, if the same template is used in other controls it should be available at the module or application level to avoid redundancy.