You understand correctly that the flat file connection manager parses .csv files, and creates columns in your (flat file) source component.
To add 'external' columns to this data stream, you simply add a derived column after the flat file source, and add whatever you need.
Where your question becomes ambiguous is when you refer to a 'custom source'. If you're using a flat file connection manager, you need to use a flat file source. But if this is inadequate for your purposes, eg you need to read a flat file with a different number of columns on each row, you could use a script component as your source. This is a 'custom' source in that you code in the rules for each output column yourself.
Either way, the answer to 'how do I add external columns' is the same - add a derived column after the source and use this to add them in.