Combinando DataTemplates em tempo de execução

Eu tenho um ListBox que apresenta uma lista de objetos de banco de dados por meio de seu ItemSource. Como cada objeto tem necessidades especiais de exibição, estou definindo um ItemTemplateSelector que retorna o DataTemplate apropriado, dependendo do objeto. Isso tudo funciona sem problemas.

Os DataTemplates para cada objeto seguem uma fórmula comum, mas contém elementos personalizados no meio. Por exemplo:

    <DataTemplate x:Key="collectibleTemplate">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <Border BorderBrush="LightGray" BorderThickness="1">
                <Expander IsExpanded="True" Header="{Binding ComponentName}" Background="WhiteSmoke">
                    <StackPanel>
                        <TextBlock Margin="5,5,5,0" Text="{Binding EditDescription}" TextWrapping="Wrap" />

                        <!-- This is the only custom part of each template -->
                        <StackPanel Margin="0,10,5,0" Orientation="Horizontal">
                            <Label Content="Type:" />
                            <ComboBox Height="22" HorizontalAlignment="Left" SelectedItem="{Binding Path=CollectibleType, Mode=TwoWay}"
                                            ItemsSource="{Binding Source={StaticResource collectibleTypeFromEnum}}" />
                        </StackPanel>
                        <!-- End custom part -->

                        <StackPanel Margin="0,0,0,5">
                            <Label Content="Available Actions:" >
                                <Label.Style>
                                    <Style TargetType="Label">
                                        <Setter Property="Visibility" Value="Visible" />
                                        <Style.Triggers>
                                            <DataTrigger Binding="{Binding EditActions.Count}" Value="0">
                                                <Setter Property="Visibility" Value="Collapsed" />
                                            </DataTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </Label.Style>
                            </Label>
                            <ItemsControl ItemsSource="{Binding EditActions}">
                                <ItemsControl.ItemTemplate>
                                    <DataTemplate>
                                        <Button Command="{Binding}" Content="{Binding Title}" ToolTip="{Binding ToolTip}" Margin="5,0,5,0"/>
                                    </DataTemplate>
                                </ItemsControl.ItemTemplate>
                            </ItemsControl>
                        </StackPanel>
                    </StackPanel>
                </Expander>
            </Border>
        </Grid>
    </DataTemplate>

Como você pode ver, há muitos XAML compartilhados, agrupando uma pequena seção personalizada no meio.

Modelos de dados adicionais serão escritos por outros engenheiros (eles desejam criar um para cada novo tipo de objeto que eles adicionam), por isso estou interessado em tornar a criação de um novo DataTemplate o mais à prova de idiotas e indolor possível. É claro que não é necessário copiar todo o DataTemplate com as "coisas" personalizadas incluídas no meio - mas também não sou parcial em extrair partes do modelo como partes reutilizáveis e referenciá-las porque ainda leva a muitos códigos duplicados no cada novo DataTemplate, e isso significa possíveis erros e manutenção difícil. Ou seja, isso aqui é uma abordagem mais sustentável, mas ainda parece subótima:

<DataTemplate x:Key="collectibleTemplate">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <Border BorderBrush="LightGray" BorderThickness="1">
                <Expander IsExpanded="True" Header="{Binding ComponentName}" Background="WhiteSmoke">
                    <StackPanel>
                        <TextBlock Margin="5,5,5,0" Text="{Binding EditDescription}" TextWrapping="Wrap" />

                        <!-- This is the only custom part of each template -->
                        [...]
                        <!-- End custom part -->

                        <ContentPresenter Content="{StaticResource AvailableActions}" />

                    </StackPanel>
                </Expander>
            </Border>
        </Grid>
    </DataTemplate>

    <StackPanel Margin="0,0,0,5" x:Key="AvailableActions" x:Shared="false">
        <Label Content="Available Actions:" >
            <Label.Style>
        <!-- 
        [Bottom half of shared XAML from the first example, offloaded here]
        -->
    </StackPanel>

Então: qual é a minha melhor estratégia para resolver isso? AFAIK, estou empolgado em usar DataTemplates porque esse é o único elemento que um ListBox ItemTemplateSelector aceita. Existe uma maneira de criar um DataTemplate composto no DataTemplateSelector? Eu forneceria o estoque DataTemplate compartilhado por todos os objetos e as referências DataTemplateSelector no bit XAML personalizado necessário para cada tipo de objeto. Outros engenheiros se conectariam a esse comportamento de código generalizado.

Não tenho certeza, me atrapalhando um pouco no escuro aqui como se houvesse um padrão que me permita resolver isso com elegância.

E, apenas para referência: meu DataTemplateSelector atual é super direto. É aqui que eu esperaria construir o DataTemplate final, em vez de simplesmente retornar um codificado no XAML.

public class NodeComponentDataTemplateSelector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        FrameworkElement element = container as FrameworkElement;

        if (element != null && item != null)
        {
            if (item is CollectibleComponent)
                return element.FindResource("collectibleTemplate") as DataTemplate;

            // [...]
        }
    }
}