もともとはUTF-16の2バイトで1文字としていたのに、UTF-16に収まらないサロゲートやら異字体セレクタや絵文字修飾子やらZWJやらで文字数の数え方が変わってしまうんです。
例えば以下の例は見た目1文字として扱えるんですよ。(フォントが対応していれば)
// 肌色違い4人家族
CString string = L"\U0001F469\U0001F3FB" L"\u200D" L"\U0001F468\U0001F3FC" L"\u200D" L"\U0001F467\U0001F3FD" L"\u200D" L"\U0001F476\U0001F3FE";
セルの入力につかわれるTextBoxには文字数制限をせずに、入力中にICUライブラリで文字数を数えて長すぎたら確定できないように警告表示、確定されそうになったらCellValidatingイベントでキャンセルをするぐらいしかできないでしょうね。
# UTF-8の1文字が今後どこまで大きくなるかわからないという