Si monitorizas el texto con el evento TextChanged, ahí puedes comprobar si el texto actual encaja con el comienzo de algún valor de la lista, y si no, deshaces el último cambio. Además de recrear la lista poniendo solo los valores que encajen con tu texto.
En este hilo puedes ver un ejemplo de cómo limitar el número máximo de caracteres. Te puedes basar en ese para empezar.