How to create a custom taxonomy using a shortcode?

It looks like you want to register custom taxonomies within shortcodes, but here’s an important notice from the Codex on the register_taxonomy function:

Use the init action to call this function. Calling it outside of an
action can lead to troubles. See #15568 for details.

Here’s an example of the action run sequence from my Twenty Fifteen home page:

muplugins_loaded                     <-- FIRST HOOK AVAILABLE
registered_taxonomy
registered_taxonomy
registered_taxonomy
registered_taxonomy
registered_taxonomy
registered_post_type
registered_post_type
registered_post_type
registered_post_type
registered_post_type
plugins_loaded
sanitize_comment_cookies
setup_theme
unload_textdomain
load_textdomain
after_setup_theme
load_textdomain
load_textdomain
auth_cookie_malformed
auth_cookie_valid
set_current_user
init                              <-- RECOMMENDED HOOK TO REGISTER TAXONOMIES
registered_post_type
registered_post_type
registered_post_type
registered_post_type
registered_post_type
registered_taxonomy
registered_taxonomy
registered_taxonomy

… continue

registered_taxonomy
registered_taxonomy
widgets_init
register_sidebar
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_loaded
parse_tax_query
parse_tax_query
posts_selection
parse_tax_query
parse_tax_query

… continue

posts_selection
template_redirect
admin_bar_init
add_admin_bar_menus
get_header
wp_head
wp_enqueue_scripts
wp_print_styles
wp_print_scripts
get_sidebar
dynamic_sidebar_before
dynamic_sidebar
                                  <-- YOU ARE TRYING TO REGISTER TAXONOMIES HERE 
dynamic_sidebar_after

… and so on

So we can see that trying to register taxonomies with shortcodes inside widgets, happens deep inside the theme code, long way from the recommended init hook.

PS: I would in general recommend using prefixed shortcode names, instead of general ones like taxonomy or taxnomy, to avoid possible name collision.

Workaround

There might be a way around this, by peeking into the database within a init hook callback and search for the shortcode instances in the widget_text option. If it exists then we could register the custom taxonomy. We also don’t want to register the same taxonomy multiple times. We would also have to check if the widget is active or inactive. I don’t know if this is a good idea in general.