Замените Header
каждого элемента TabItem на ContentControl, который оборачивает фактическое содержимое для этого заголовка, а также заменив ContextMenu:
<TabItem>
<TabItem.Header>
<ContentControl Content="FirstTab">
<ContentControl.ContextMenu>
<ContextMenu>
<MenuItem Header="Foo" />
<MenuItem Header="Bar" />
<MenuItem Header="Baz" />
</ContextMenu>
</ContentControl.ContextMenu>
</ContentControl>
</TabItem.Header>
<Grid Background="CornflowerBlue" />
</TabItem>
Очевидно, что это также можно сделать полностью в коде, и если вы меню должно быть только динамическим c, тогда вы можете просто объявить пустое ContextMenu следующим образом:
<ContentControl Content="FirstTab">
<ContentControl.ContextMenu>
<ContextMenu x:Name="FirstMenu" />
</ContentControl.ContextMenu>
</ContentControl>
... и затем заполнить это кодом:
FirstMenu.Items.Add(new MenuItem { Header = "Foo" });
FirstMenu.Items.Add(new MenuItem { Header = "Bar" });
FirstMenu.Items.Add(new MenuItem { Header = "Baz" });