How should I approach changing the template & $query as part of a shortcode’s execution?

By the time your shortcode runs on the the_content hook (usually) the main query has executed, the pre_get_posts hook has fired for the main query, and the template_redirect hook has fired.

You won’t be able to hook to template_redirect or alter the main query (if that is what you need) without somehow getting your shortcode to run much earlier than shortcodes normally would, which means parsing shortcodes in your pre_get_posts hook callback or even earlier, depending on the details of what you are trying to do.

And that probably means retrieving the posts (you don’t have access to post content at the pre_get_posts stage), parsing the shortcodes, and then retrieving the posts again with the query alterations. That is a pretty heavy load.

It sounds to me like you are trying to get shortcodes to serve a function they aren’t really meant to serve. A shortcode is a BB-Code-like post content formatting and display function not an alter the Loop and redirect function.

Maybe you’d have better luck if you were to explain the result you wanted rather than ask how to implement a particular solution.