ContextMenuのMenuItemのへのデータバインディングはDateTmeplateでもHierarchicalDataTemplateでもなくStyleでよかった。DateTmeplateにしてしまうとMenuItemのContentの中にもうひとつMenuItemができてしまう。
ただし、セパレータの指定は別。例えばMenuItemViewModel内のプロパティをもとにStyleSelectorで振り分けるとすでにMenuItemなっているからSeparator型で指定するとエラーになってしまう。SeparatorはItemTmeplateSelectorでSeparatorだけ入ったDateTmeplateを指定すればいい。