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