It would seem that the problem is in Term::ReadLine::Gnu::XS::_trp_completion_function() (shell for a custom completion function).
Your matches are correctly extracted from your complete_word() function, but the following snippet from the wrapper matches its case:
for (; $_i <= $#_matches; $_i++) { return $_matches[$_i] if ($_matches[$_i] =~ /^\Q$text/); }
where @_matches is the result of your complete_word() and $text is the completed text.
So it looks like the answer is no, there is no supported way to get Term::ReadLine::Gnu to complete case-insensitive. You will have to override the private Term::ReadLine::Gnu::XS::_trp_completion_function (ugly hack to be sure) - or modify XS.pm directly (possibly even an uglier hack).
EDIT: Term::ReadLine::Gnu version used: 1.20
source share