It should be possible in the DLL.
In CvPlayer.cpp you have CvPlayer::getTradeDenial(), which can return a denial type. NO_DENIAL means the item won't be red. All other types mean it would be red with different reasons.
This function calls other functions for different types of trade (tech, civic, maps etc.). In most of them you have:
Code:
if (isHuman())
{
return NO_DENIAL;
}
So in order to do what you ask, you need to keep for each possible trade item and each rival (yes, this is decided on a per-rival basis) a 'denial' flag (and probably save it as part of the player class), use this value to modify the above return value, save/load it to the saved game file, and you need UI for editing this. All in all - quite a lot of work.
Personally I think this idea is not needed in the game, and that there are no balance issues in this regard. The AI simply evaluates this every time, and this feature's only use is to save the human player from trying dozens of different trades which will never happen.
And managing this for each opponent is simply too much work for the player. It's not like you have so many offers from the AI players (how many? 2-3 a turn max?) that it's worth micro managing it, or losing the control for each trade offer.
It seems that what you want is a way to bypass bad reputation when you deny a request. I'm sure there are simpler ways (simply mod out this reputation hit, for one).
But if you still want it - the above is the way to start it.