You can postpone the wp_autop filter. WordPress has this filter enabled by default. And it is processing before the shortcode output.
remove_filter( 'the_content', 'wpautop' );
add_filter( 'the_content', 'wpautop' , 12);
Add this to your functions.php
and check if the problem persist!
See a similar problem here: stray <p> elements