I thought about my ControlTemplate issue and realized I hadn't defined my problem fully. I didn't need custom properties. I just didn't want my ControlTemplate XAML living stuck in some <resources> tag in some parent container.
Easy fix: I wrapped my custom ControlTemplate with a ResourceDictionary tag and put it into its own XAML file, similar to how styles are defined. I load the ResourceDictionary via code, so users don't have to muck around with merging this dictionary in.
SimpleMarkerSymbol symbol = new SimpleMarkerSymbol {Color = brush, Size = 8};
MyCustomResourceDictionary dictionary = new MyCustomResourceDictionary ();
ControlTemplate controlTemplate = (ControlTemplate)dictionary["SelectableMarkerSymbolTemplate"]; symbol.ControlTemplate = controlTemplate;
I can see two other alternative solutions to my problem. The most obvious is to simply create an alternative Symbol classes / XAML to use, which include any missing attributes. Another option might be to nest a ContentControl/ContentPresenter inside the Symbol's ControlTemplate, and bind that to a custom visualization.