WordPress stores callbacks in an array keyed by hook name and then by priority. remove_action() looks in exactly one of those priority buckets — the one you name, defaulting to 10 — so removing a callback registered at any other priority silently does nothing and returns false.
add_action('wp_head', 'shop_print_meta', 20);
remove_action('wp_head', 'shop_print_meta'); // false, nothing removed
remove_action('wp_head', 'shop_print_meta', 20); // removed
The second thing that makes this fail is timing: the callback has to have been added before you try to remove it, which means a theme cannot remove a plugin callback at load time and has to wait for init or later. And a callback registered as an object method can only be removed by passing an array with the same instance in it, so a plugin that registers array($this, "render") from inside its constructor is effectively unremovable unless it kept the instance somewhere reachable.