You need transitional tile-maps for every possible transition, that is correct, if you want to explicitly transition between each material type. There are only 14 possible transitions positions (excluding the "all wall"/"all floor" non-transition tiles) provided you're allowing only 90 degree angles. FWIW, the example i've given above misses 2 possibilities, the two diagonals (top right + bottom left, and Top left + bottom right).
When making 2d tile-maps my approach in Photoshop is create a square texture, paste the background texture (that happens to be tiled so edges are not a problem) select the whole area, shrink the selection by 1/3rd of the space, paste the foreground (which again is tiled) texture, and then using border selection create an appropriately thick 'wall' between the two as a transition so it looks good. Then do the inverse for the reverse transition, noting that the N,E,S,W cells should be the same as the corresponding S,W,N,E cells (more or less) from the first image, finally, i take the two diagonals and overlay them to create the diagonal blocks. Typically for a prototype this might take ~20 mins per terrain type for basic transitions.
In changing tiles; when you change one tile, you trigger each neighbor to recalculate their neighbors and adjust appropriately, the same generation approach applies. Note its important to only trigger the changes when you change something, as re-scanning your entire tile-map every frame is costly.
Yes, this is a common way to do it, again you're talking about in 2d space only 16 options for a specific cell's shape. It can be achieved using flags, values, or calculations however for a 2d tile-map it happens to be only hexadecimal F options per terrain type, and easily visualized when converting to binary, if we let 1 represent a wall, and 0 represent a floor/or transparency. Note: i'm assuming we're working clockwise from the top left.
0000/1111 = ground or wall fully filled,
0001,0010,0100,1000 = are all outer corners (only the corner (1) is a wall)
0011,0110,1100,1001 = are all straight edges
1011,1101,0111,1110 = all inner corners (the corner (0) is a floor)
1010, 0101 = are the diagonals, which graphically would meet at the center
A lookup table based on these values can easily be constructed, and IIRC can be faster than a calculated method of working it out.