Проблема в том, как работает ItemsControls. Для ListBox его элементы «обернуты» с помощью ListBoxItem (при условии, что элемент не является ListBoxItem). Поэтому, если вы добавите UserControl как элемент в ListBox, он в конечном итоге окажется в свойстве ListBoxItem.Content и будет представлен.
В TabControl его элементы оборачиваются элементом TabItem. В отличие от ListBoxItem, TabItem является производным от HeaderedContentControl. Итак, еще раз, если вы добавите UserControl как элемент в TabControl, он в конечном итоге окажется в свойстве TabItem.Content и будет представлен.
Теперь, если добавляемый элемент не является визуальным (например, DependencyObject), тогда элемент также будет присвоен свойству TabItem.Header. Так что в вашем случае, переключая базовый класс с DependencyObject на UserControl, вы переключаете это поведение.
Причина, по которой визуал не установлен как TabItem.Content, так и TabItem.Header, заключается в том, что тогда он может оказаться в дереве визуалов в двух местах, что плохо.
EDIT:
Кроме того, ItemTemplate передается в TabItem.HeaderTemplate, а не TabItem.ContentTemplate (как в случае ListBoxItem).