Shortcode – Getting Categories appears on top of website

A few things:

  1. You’re running your add_shortcode() function in wp_head. You don’t need to do that.
  2. Your life_shortcode() function is returning a value, not echoing it. So it’s not going to be caught by the output buffer and ob_get_clean() will return nothing.
  3. wp_list_categories() is echoing, so is not going to be properly put into $mycats and is going to be output at the top of the page whenever your shortcode is used.

The proper way to organise this code would be:

function life_shortcode() {
    $args = array('title_li' => '', 'echo' => false);
    $mycats = wp_list_categories($args);

    return '<div class="conmenu"><a class="salit" href="https://wordpress.stackexchange.com/lifestyle/"><i class="x-icon-home" data-x-icon=""></i></a><ul>' . $mycats . '</ul></div>';
}
add_shortcode( 'lifemenu', 'life_shortcode' );

Also note that I’ve passed the function name directly to add_shortcode(), rather than use an anonymous function that calls the original function. This way uses less code, and makes it easier for it to integrate with other plugins, if necessary.