τελικά το έκανα με <TextDecoration.Pen>
σπάω το άρχικο string σε substrings (υπογραμμισμένα και όχι υπογραμμισμένα)
και μετά κάνω bind το Thickness για κάθε substring (0 για τα μη υπογραμμισμένα και 2 για τα υπογραμμισμένα) οπότε βγαίνει κάτι του στυλ:
<DataTemplate x:Key="ColorTemplate2">
<ItemsControl ItemsSource="{Binding Path=C}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel IsItemsHost="True" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<ItemsControl ItemsSource="{Binding Path=D}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel IsItemsHost="True" Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock xml:space="default" Text="{Binding Path=Text}" TextWrapping="NoWrap" TextTrimming="CharacterEllipsis" VerticalAlignment="Center" HorizontalAlignment="Left">
<TextBlock.TextDecorations>
<TextDecorationCollection>
<TextDecoration PenThicknessUnit="FontRecommended">
<TextDecoration.Pen>
<Pen Brush="Red" Thickness="{Binding Path=Val}" />
</TextDecoration.Pen>
</TextDecoration>
</TextDecorationCollection>
</TextBlock.TextDecorations>
</TextBlock>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DataTemplate>
είναι σε DataTemplate γιατι το ήθελα για ένα Listview. επίσης είναι nested ItemControl γιατί είχα πρόβλημα με το carriage return/line feed (η TextBlock είτε τα αγνοούσε είτε δεν έκανε layout όπως ήθελα)
μόλις αποκτήσω μεγαλύτερη ευχέρεια θα προσπαθίσω να φτιάξω το δικό μου TextBlock
btw, μήπως υπάρχει κανά καλό tutorial για το πώς φτιάχνει κανέις τα δικά του controls?