I usually avoid custom property types, I prefer sticking to custom editors (where needed) and a block property (or blocks in a content area) for the property values.
Perhaps a viable approach would be to:
1) Create a block type like SizeSpecificHeadingBlock with:
- A string property called Size with a SelectOne attribute configured for a SelectionFactory returning the valid size boundary options
- Another string property Heading for the actual heading text
Next you could add a ContentArea with AllowedTypes set to SizeSpecificHeadingBlock.
When rendering the ContentArea, you'd simply render the heading for the current size.
However, this would require editors to create one block per heading variation, which is a bit cumbersome - but you could complement this approach with a custom editor to simplify the process.
Using a native way to store property values (instead of a custom property type) makes your implementation more future-proof. Also, if your custom editor should ever fail, you can always disable it and just use the "vanilla" EPiServer UI to editor your property values.
Edit: Although currently in beta, it might be relevant to make use of PropertyList<YourCustomType> for this kind of scenario, to avoid having to create nested blocks: http://world.episerver.com/blogs/Per-Magne-Skuseth/Dates/2015/11/trying-out-propertylistt/