Well, it's a little cheating involved :)
LilyPond does checks for grob-properties, you can't write
\override Grob.self-invited-property = ...
without "explaining" this `self-invited-property´ to LilyPond.
But details and bound-details are established properties taking alists
containing key-value-pairs of subproperties.
Adding a new one like `arrow-left´ will not disturb other procedures
reading `(bound-)details´, they simply don't look for the new ones
(ofcourse you need to care not to take a preserved one). There is no
checking of subproperties.
So I code frequently this way.
I believe bound-details is more common for grobs with the
line-spanner-interface, but it makes no real difference, afaik.
I'm aware doing
arrow-left -> LEFT
arrow-right -> RIGHT
is not that elegant, but thee are two names needed with three options
LEFT/RIGHT/#f
I'll have to think over it.