While playing with Ciri, rush Caranthir and slash him down in a couple of quick successions. As soon as he teleports after some damage, either sprint to his location or use your Teleport to reach him faster.
One thing that you need to bear in mind is that Caranthir can also teleport directly behind Ciri, but you can always come up with a Fast Attack or a Teleport Slash. Caranthir also clads himself in ice which Geralt can melt using Igni and even stagger him for a while, but Ciri can’t do anything about it!
After Geralt joins the fight, make sure that you don’t get hit by one of the lances over Caranthir’s head. These lances will not only freeze you in your place, but will also allow Caranthir to come up with more follow-up attacks.
Luckily, these lances and bolts can easily be evaded by rolling in any direction; preferably sideways. While playing as Geralt, you can also use your Fast Attacks to disrupt and force Caranthir into cancelling his Ice Bolts attacks.
As soon as you see Caranthir summoning Ice Elementals into the field; take the opportunity and punish him as much as you can!
You can use Dimeritium Bombs to weaken him before focusing your attention on the Ice Elementals. At the very end of the fight, Caranthir will try and drown you; simply swim to the shore as fast as you can and end this long and tedious fight!