How to only show the first X words (from each post) on the home page?

Changing the word count on the home page is easy:

if( is_home() )
  add_filter( 'excerpt_length', create_function( '', 'return 300;' ) );

Just replicate that code and change the conditional check to add this to other pages. The other option is to just insert the code on the template page (home.php, tag.php, etc.), so you know it’s going to be set on the correct page.

Using the_excerpt() will automatically strip shortcodes and html from the content if there’s no excerpt provided. You can remove these filters, but it makes it much much harder to do word counts when you’re adding markup into the mix. If you want the formatting/text/images preserved, that’s what the more tag is for. It’s inserted manually because it’s too difficult to automatically figure out in all instances where that break should go.