Yeah, you can design the board entirely in another program - just try to keep the size down (and by this I mean mb’s). Also, though, you can let vassal map out a default board (width/height/color) and then add separate “board images” onto that (these would be like adding pieces/cards to the map window - with at-start stacks - but you can make them the lowest layer on the board (using Game Piece Layers - so they’re always underneath all the actual pieces/cards moving above them) and have them be unselectable and not movable at all (using Does Not Stack trait). So those added “board pieces” look and act just like part of a board drawing… but vassal’s doing most the work and the size is minimal.
The locations would be the same either way, although yeah it might be easier to initially deduce placements using another program. Here’s a sort of trick though using a vassal default board. Add a test card onto the map using an at-start stack and then add a report action trait into it… reporting on this keystroke: mainmapGKC, and reporting: $CurrentX$ / $CurrentY$. Then go into your map’s properties, and on the last property listed (Key Command to apply to units ending movement…) type: mainmapGKC. Now save and open the game and when you move the card about the board, it’ll tell you exactly what the location of it is. You can add a clone trait to it, and then use a few of them to get some settings for side by side placements. Hope this makes sense.
The Send to Location offers a lot of flexibility in sending cards… regions added to an irregular grid or zones or hex locations or even other pieces (including for example those “board pieces” mentioned above).