Shortcode to return single custom post based on post taxonomy

From your supplied info, it’s not all very clear to me. But as far as I’ve understood your problem, here’s my approach.
Assuming we have the following shortcode that the user has put inside a normal post’s content and that this shortcode will pull information from your custom post type case_studies:

[casestudy study_type="mountain"] 

So firstly, your shortcode handler:

add_shortcode( 'casestudy', 'my_shortcode' );

function my_shortcode( $atts ) {
    $a = shortcode_atts( array(
        'study_type' => 'mountain',
    ), $atts );

    $content = my_template( $a );

    return $content;
}

Pay close attention to the shortocode_atts() function. It’s meant to filter the accepted parameters that your template function’s query below will be able to handle.

Then, your template:

function my_template( $a ) {
    /**
     * I believe we should be in the loop already when this function is being called.
     * So to get the category slug of the current post in which the user has put the shortcode, you can try this.
     */
    $category_terms = get_the_category();

    $args = array(
        'post_type'      => 'case_studies',
        'name'           => $a['study_type'],
        'category_name'  => $category_terms[0]->slug,
        'posts_per_page' => 1,
    );

    $query = new WP_Query( $args );

    ob_start();

    if ( $query->have_posts() ) {
        while ( $query->have_posts() ) {
            the_post();

            echo '<h3>' . get_the_title() . '</h3>';
            echo '<p>' . get_the_content() . '</p>';
        }

        reset_postdata();
    }

    return ob_get_clean();

}