Pivot Multiple Columns with a Cross Apply
I eventually managed to get this working. Had to use a Cross Apply to flatten for the multiple pivots:

WITH CoreGateway AS
(
SELECT      pg.ProjectId
,           g.GatewayTitle
,           ggs.GatewayGatewayStepId
,           cc.tC02
,           cc.CarbonCost
FROM        pmp.ProjectGateway      pg
LEFT JOIN   pmp.CarbonCalculated    cc  ON  cc.ProjectGatewayId         = pg.ProjectGatewayId
JOIN        ref.GatewayGatewayStep  ggs ON  ggs.GatewayGatewayStepId    = pg.GatewayGatewayStepId
JOIN        ref.Gateway             g   ON  g.GatewayId                 = ggs.GatewayId
JOIN        ref.GatewayStep         gs  ON  gs.GatewayStepId            = ggs.GatewayStepId
WHERE       gs.GatewayStepTitle     = 'Carbon Calculated'
)
, CarbonData AS
(
SELECT      cg.ProjectId
,           cg.GatewayTitle + CarbonType AS GatewayTitle
,           CarbonValue
FROM        CoreGateway     cg
CROSS APPLY (
            VALUES  (cg.tC02, 'tC02')
            ,       (cg.CarbonCost, 'CC')
            ) c (CarbonValue, CarbonType)
)
SELECT      p.ProjectId
,           p.SolutionId
,           p.NeedId
,           p.ProjectCode
,           p.ProjectDescription
,           ISNULL([Gateway 1CC], 0.0)      AS Gateway1_CarbonCost
,           ISNULL([Gateway 3CC], 0.0)      AS Gateway3_CarbonCost
,           ISNULL([Gateway 3CC], 0.0) -
            ISNULL([Gateway 1CC], 0.0)      AS Gateway3_CarbonCost_Diff
,           ISNULL([Gateway 5CC], 0.0)      AS Gateway5_CarbonCost
,           ISNULL([Gateway 5CC], 0.0) -
            ISNULL([Gateway 1CC], 0.0)      AS Gateway5_CarbonCost_Diff
,           ISNULL([Gateway 9CC], 0.0)      AS Gateway9_CarbonCost
,           ISNULL([Gateway 9CC], 0.0) -
            ISNULL([Gateway 1CC], 0.0)      AS Gateway9_CarbonCost_Diff
,           ISNULL([Gateway 1tC02], 0.0)    AS Gateway1_tC02
,           ISNULL([Gateway 3tC02], 0.0)    AS Gateway3_tC02
,           ISNULL([Gateway 3tC02], 0.0) -
            ISNULL([Gateway 1tC02], 0.0)    AS Gateway3_tC02_Diff
,           ISNULL([Gateway 5tC02], 0.0)    AS Gateway5_tC02
,           ISNULL([Gateway 5tC02], 0.0) -
            ISNULL([Gateway 1tC02], 0.0)    AS Gateway5_tC02_Diff
,           ISNULL([Gateway 9tC02], 0.0)    AS Gateway9_tC02
,           ISNULL([Gateway 9tC02], 0.0) -
            ISNULL([Gateway 1tC02], 0.0)    AS Gateway9_tC02_Diff
FROM        (
            SELECT  cd.ProjectId
            ,       cd.GatewayTitle
            ,       cd.CarbonValue
            FROM    CarbonData  cd
            )   cc
PIVOT       (
            MAX(CarbonValue) FOR GatewayTitle IN    (   [Gateway 1CC], [Gateway 3CC], [Gateway 5CC], [Gateway 9CC]
                                                    ,   [Gateway 1tC02], [Gateway 3tC02], [Gateway 5tC02], [Gateway 9tC02]
                                                    )
            ) carpvt
JOIN        pmp.Project p   ON p.ProjectId = carpvt.ProjectId;