Try to use you own compare function. TStringList does an AnsiCompare by default.
Try this:
function UTF8Compare(List: TStringList; Index1, Index2: Integer): Integer;
begin
Result:=WideCompareStr(UTF8Decode(List[Index1]),UTF8Decode(List[Index2]));
end;
...
sl.CustomSort(@UTF8Compare);