Is there any inherent difference between add_filter() and add_shortcode() for modifying [caption]?

add_shortcode() may be overwritten, dependent upon at what point it is hooked, whereas you would have to remove_filter() to prevent the filter from executing. I think the way to go is to use apply_filters(), as that functionality is clearly put in place to do exactly what you’re trying to do.