I'm a pretty big fan of how Yeomen handles assets in an angular generator. It uses wiredep to automatically include Bower packages in your index.html. Usemin is used to group the files you want in packages, and Filerev updates the location of the assets and adds a cache breaker. Here is an example of some Grunt options that I have.
wiredep: { app: { src: ['<%= yeoman.app %>/index.html'], exclude: ['bootstrap.css'], fileTypes: { html: { replace: { js: '<script src="/{{filePath}}"></script>', css: '<link rel="stylesheet" href="/{{filePath}}" />' } } }, ignorePath: /\.\.\// } }, // Renames files for browser caching purposes filerev: { dist: { src: [ '<%= yeoman.dist %>/scripts/{,*/}*.js', '<%= yeoman.dist %>/styles/{,*/}*.css', '<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}', '<%= yeoman.dist %>/styles/fonts/*' ] } }, // Reads HTML for usemin blocks to enable smart builds that automatically // concat, minify and revision files. Creates configurations in memory so // additional tasks can operate on them useminPrepare: { html: '<%= yeoman.app %>/index.html', options: { dest: '<%= yeoman.dist %>', flow: { html: { steps: { js: ['concat', 'uglifyjs'], css: ['cssmin'] }, post: {} } } } }, // Performs rewrites based on filerev and the useminPrepare configuration usemin: { html: ['<%= yeoman.dist %>/**/*.html'], css: ['<%= yeoman.dist %>/styles/{,*/}*.css'], options: { assetsDirs: ['<%= yeoman.dist %>', '<%= yeoman.dist %>/images'], patterns: { js: [ [/templateUrl:"(templates[/A-Za-z0-9]*\.html)"/] ] } } },
Corresponding npm packages grunt-wiredep , grunt-filerev and grunt-usemin
You will need to add the grunt build process after MSBuild, which takes the files in your bin folder and runs these tasks on them.