"aceptar lo menos que pueda, pero devuelve la máxima" es lo que defiendo. Cuando un método devuelve un objeto, qué justificaciones tenemos para no devolver el tipo real y limitar las capacidades del objeto devolviendo un tipo base. Sin embargo, esto plantea una pregunta sobre cómo sabemos cuál será el "máximo" (tipo real) cuando diseñemos una interfaz. La respuesta es muy simple. Solo en casos extremos en los que el diseñador de la interfaz está diseñando una interfaz abierta, que se implementará fuera de la aplicación/componente, no sabría cuál puede ser el tipo de devolución real. Un diseñador inteligente siempre debe considerar qué debería hacer el método y cuál debería ser el tipo de retorno óptimo/genérico.
E.g. Si estoy diseñando una interfaz para recuperar un vector de objetos, y sé que la cantidad de objetos devueltos va a ser variable, siempre asumiré que un desarrollador inteligente siempre usará una Lista. Si alguien planea devolver un Array, cuestionaría sus capacidades, a menos que él/ella solo esté devolviendo los datos de otra capa que él/ella no posee. Y esta es probablemente la razón por la que FxCop aboga por ICollection (base común para List y Array).
Lo anterior se dice, hay un par de cosas a tener en cuenta
En cuanto a las evaluaciones perezosas de LINQ, estoy seguro de que el 95% de los usuarios de C# no entienden las intestatudes. Es tan no-oo-ish. OO promueve cambios de estado concretos en las invocaciones de métodos. La evaluación diferida de LINQ promueve cambios de estado de tiempo de ejecución en el patrón de evaluación de expresiones (no es algo que los usuarios no avanzados siempre siguen).
Como indica el OP, si es necesario devolver una clase concreta, FxCop recomienda devolver una 'Colección' en lugar de una 'Lista '. Consulte también [Colección frente a la lista ¿qué debería usar en sus interfaces?] (http://stackoverflow.com/q/271710/1497596). –
DavidRR