First thing is that your query syntax is correct so the problem is either that there are no tshirt
posts under the category term id your querying for or the post type was not registered properly to use categories: 'taxonomies' => array( 'category' )
You can test for this by adding a var_dump() to your loop that works without adding the cat.
while($tshirt_query->have_posts()) : $tshirt_query->the_post();
$categories = get_the_category();
foreach ( $categories as $category ) {
var_dump( $category );
}
This will give you an array of each category associated with the post to determine where the problem lies.
Example $category dump from a custom post type in the world category with an id of 4:
object(stdClass)[361]
public 'term_id' => &string '4' (length=1)
public 'name' => &string 'World' (length=5)
public 'slug' => &string 'world' (length=5)
public 'term_group' => string '0' (length=1)
public 'term_order' => string '1' (length=1)
public 'term_taxonomy_id' => string '4' (length=1)
public 'taxonomy' => string 'category' (length=8)
public 'description' => &string '' (length=0)
public 'parent' => &string '0' (length=1)
public 'count' => &string '3' (length=1)
public 'object_id' => string '86' (length=2)
public 'cat_ID' => &string '4' (length=1)
public 'category_count' => &string '3' (length=1)
public 'category_description' => &string '' (length=0)
public 'cat_name' => &string 'World' (length=5)
public 'category_nicename' => &string 'world' (length=5)
public 'category_parent' => &string '0' (length=1)