Why are source and channel encodings usually performed separately? Could they be made together?
One of the central results of applied information theory is that you can do them separately!
So, that's usually what you want to do: first remove as much redundancy as possible with a method that uses knowledge of the structure of the data source, and then use the output of that with a channel coder that uses as much knowledge of the nature of the channel as possible.
It's generally not desirable to combine these functionalities, but yes, of course, you could concatenate these into a new function and call it "sourcechannelcoding" or whatever. It simply won't have any advantage over considering them separately.
And that's great! It means we can optimize source and channel coding independently.