Example of the first output being a masternode reward
Example of the first output being a proof-of-work reward

What determines the order of the outputs in the generation transaction?

As far as I understand it:

In src/miner.cpp in the CreateNewBlock function it is determined that the vout index for proof-of-work is 0. Line 86-90:

CMutableTransaction txNew;
txNew.vout[0].scriptPubKey = scriptPubKeyIn;

Later on in the function it calls the FillBlockPayments function In src/masternode-payments.cpp Line 294:

FillBlockPayments(txNew, nHeight, blockReward, pblock->txoutMasternode, pblock->voutSuperblock);

which calls the FillBlockPayee function. Line 222:

mnpayments.FillBlockPayee(txNew, nBlockHeight, blockReward, txoutMasternodeRet);

There the masternode reward is appended as an additional vout to the transaction txNew. Line 287-291:

// split reward between miner ...
txNew.vout[0].nValue -= masternodePayment;
// ... and masternode
txoutMasternodeRet = CTxOut(masternodePayment, payee);

Why then, in the generation transaction, is the first output not always the proof-of-work reward?