Someone may correct me, but I think as of Version 3.3 you can enqueue scripts and styles “inline” of a post.
Means: you can add your wp_enqueue_script / style inside your shortcode function and WordPress will add them to the footer…since it’s too late to add them to the header.
Means: It will just work whenever the shortcode gets called.
Edit: in reply to Nick’s comment below regarding where to add the enqueue function:
I did a quick test with the example shortcode from the codex:
function caption_shortcode( $atts, $content = null ) {
wp_enqueue_script('myscript','nonexistinglocation');
wp_enqueue_style('mystyle','throwmeanerror');
return '<span class="caption">' . $content . '</span>';
}
Tested it inside post content and text widget and worked so far ( disregarding the invalid URLs) The functions should be called before the return of course, (and yes, do it the right way, and register your script and styles beforehand [lazy])