# Perl, <strike>702</strike> <strike>613</strike> <strike>546</strike> <strike>474</strike> 439 bytes

Perhaps still long compared to others. 
So I assume a Perl veteran could do much better.  
Using an 2D array might not have been the best tactic to achieve minimal code.  But hey, I tried. :)

<!-- language-all: lang-perl -->

    @m=split(',',pop);map{($d,$s)=/^(.)(.+)$/;for(1..$s){if($x>$A){$A=$x}if($x<$a){$a=$x}if($y>$B){$B=$y}if($y<$b){$b=$y}$x-=W eq$d;$x+=E eq$d;$y-=N eq$d;$y+=S eq$d}}@m;$A-=$a;$x=-$a;$B-=$b;$y=-$b;$a=$b=0;map{($d,$s)=/^(.)(.+)$/;for(1..$s){$c=$x;$C=$y;if($d eq"W"){$r="<";$x--}if($d eq"E"){$r=">";$x++}if($d eq"N"){$r="^";$y--}if($d eq"S"){$r=v;$y++}$q[$c][$C]=$r}}@m;$q[$c][$C]=X;for$y(0..$B){for$x(0..$A){$t=$q[$x][$y];print$t?$t:$"}print$/}

  
Test

    $ perl piratemap.pl "N10,E6,S5,W4,N1,E3,N3,W4,S10"  
    >>>>>>v
    ^v<<<<v
    ^v   ^v
    ^v   ^v
    ^v>>>^v
    ^v^<<<<
    ^v
    ^v
    ^v
    ^v
    ^X