Make me a s'more!

Python 2, 73 48 bytes

lambda w,g,c,m:zip(*['G'*g+'C'*c+'M'*m+'G'*g]*w)

Try it online!

Creates a transposed version of the answer, than transposes it to the correct format with zip(*l)


05AB1E, 21 19 19 bytes

"GCMG"S×|D«‚øvy`.D»

Try it online!

-2 thanks to my oversight and Emigna.

"GCMG"S×            # Push GCMG, separate, duplicate n times.
        |D«         # Push rest of inputs, doubled.
           ‚ø       # Wrap GCMG array and input array, then zip them into pairs.
             vy`.D» # For each pair, print n of G/C/M/G.

(See Emigna's answer, it's better: https://codegolf.stackexchange.com/a/116787/59376)


05AB1E, 17 16 bytes

1 bytes saved thanks to carusocomputing.

"GCMG"S×vy²Nè.D»

Try it online!

Input order is W, [G,C,M]

Explanation

10, [3,2,1] used as example.

"GCMG"S           # push the list ['G','C','M','G']
       ×          # repeat each W times
                  # STACK: ['GGGGGGGGGG', 'CCCCCCCCCC', 'MMMMMMMMMM', 'GGGGGGGGGG']
        v         # for each [string, index] y,N in the list
          ²Nè     # get the amount of layers at index N from the [G,C,M] list
         y   .D   # duplicate the string y that many times
               »  # join strings by newlines