Während @esdd in ihrem Kommentar bereits eine Lösung angegeben hat, will ich ein wenig die Ursachen beleuchten.
Die Ursache dafür, dass die Optionenauswertung von `setspace` hier funktioniert, die von `csquotes` aber nicht, liegt in der Art der Definition der Optionen. Bei `setspace` sind alle Optionen in der Form:
\DeclareOption{foo}{do}
deklariert. Jede Option `foo` ist also explizit mit ihrem Namen und einer zugehörigen Aktion definiert.
Bei `csquotes` sind die Optionen dagegen alle per
nach dem Schema
\DeclareOption*{do for \CurrentOption}
deklariert. Es werden also *alle* Optionen in irgend einer Form verarbeitet. **Aber** dieses *alle* bezieht sich dafür nur noch auf die Optionen, die explizit an das Paket übergeben wurden und nicht mehr auf die Optionen, die als globale Optionen angegeben wurden. Deshalb funktioniert bereits:
\documentclass[doublespacing,spanish=mexican]{article}
\usepackage[T1]{fontenc}
\usepackage[spanish,ngerman]{babel}
\usepackage{setspace}
\usepackage{csquotes}
\usepackage{blindtext}
\begin{document}
Doppelter Zeilenabstand funktioniert: \blindtext
Spanische Zitate im mexikanischen Stil funktionieren nicht: \foreignquote{spanish}{amigo}
\end{document}
nicht wie gewünscht, sondern liefert die Warnung: `LaTeX Warning: Unused global option(s): [spanish=mexican].`
Man müsste nun also explizit dafür sorgen, dass alle globalen Optionen zu denen es (vermutlich) eine `key=value`-Option in `csquotes` gibt, explizit an das Paket übergeben werden. Das ginge beispielsweise so:
\RequirePackage{filecontents}
\begin{filecontents}{Testklasse.cls}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{Testklasse}
\ProcessOptions\relax
\LoadClass{article}
\RequirePackage[spanish,ngerman]{babel}
\RequirePackage{keyval}
\let\orig@define@key\define@key% Originaldefinition speichern
\def\define@key#1#2{% Definition von \define@key ändern
\begingroup
% Prüfen, ob eine csquote-Option definiert wird:
\edef\reserved@a{#1}\def\reserved@b{csq}%
\ifx\reserved@a\reserved@b
% Prüfen, ob diese Option in den globalen Optionen vorkommt:
\edef\reserved@a{#2}%
\@for\CurrentOption:=\@classoptionslist\do{%
\expandafter\My@KV@split\CurrentOption==\relax
\ifx\reserved@a\reserved@b
% Option explizit an csquotes übergeben.
\PassOptionsToPackage{\CurrentOption}{csquotes}%
\fi
}%
\fi
\endgroup
\@ifnextchar[{\KV@def{#1}{#2}}{\long\@namedef{KV@#1@#2}####1}}
\long\def\My@KV@split#1=#2=#3\relax{%
\KV@@sp@def\reserved@b{#1}%
}
\RequirePackage[autostyle]{csquotes}
\let\define@key\orig@define@key% Änderung wieder zurücknehmen
\RequirePackage{setspace}
\end{filecontents}
\documentclass[doublespacing,spanish=mexican]{Testklasse}
\usepackage[T1]{fontenc}
\usepackage{blindtext}
\begin{document}
Doppelter Zeilenabstand funktioniert: \blindtext
Spanische Zitate im mexikanischen Stil funktionieren nicht: \foreignquote{spanish}{amigo}
\end{document}
**Aber:** Das hat auch einen ganz großen Nachteil. Setzt man nun beispielsweise per `\documentclass[spanish=blumentopf]` eine globale Option, die so aussieht, als könnte `csquotes` etwas damit anfangen, es kann aber in Wirklichkeit nichts damit anfangen, dann bekommt man nicht nur die Warnung: `LaTeX Warning: Unused global option(s): [spanish=blumentopf].`, sondern man erhält eine Fehlermeldung: `! Package csquotes Error: Quote style not defined.` Das erscheint zunächst nicht weiter problematisch. Sobald es aber ein Paket gibt, das die Option `spanish=blumentopf` kennt, wird das ein Problem.
Wollte man dieses Problem lösen, müsste `csquotes` seine Optionen entweder alle per `\DeclareOption` statt `\DeclareOption*` deklarieren oder aber ein Paket wie `scrbase` für die Deklaration der Optionen verwenden.
Da man aber `csquotes`-Optionen grundsätzlich nicht als globale Optionen übergeben kann, ist das ganze eigentlich gar kein Problem. Man muss dann nur wissen, dass man Optionen nicht nur beim Laden des Pakets, sondern eben auch schon zuvor per `\PassOptionsToPackage` angeben kann. Daher ist die Lösung wie von @esdd bereits vorgeschlagen:
\begin{filecontents}{Testklasse.cls}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{Testklasse}
\ProcessOptions\relax
\LoadClass{article}
\RequirePackage[spanish,ngerman]{babel}
\RequirePackage[autostyle]{csquotes}
\RequirePackage{setspace}
\end{filecontents}
\PassOptionsToPackage{spanish=mexican}{csquotes}
\documentclass[doublespacing]{Testklasse}
\usepackage[T1]{fontenc}
\usepackage{blindtext}
\begin{document}
Doppelter Zeilenabstand funktioniert: \blindtext
Spanische Zitate im mexikanischen Stil funktionieren nicht: \foreignquote{spanish}{amigo}
\end{document}
Nebenbei erwähnt: Wenn `article` die Optionen von `\documentclass` auswerten soll, sollte es per `\LoadClassWithOptions` geladen werden.