The syntax is switch ( condition ) statement with
condition     -   any expression of integral or enumeration type, or of a class type contextually implicitly convertible to an integral or enumeration type, or a declaration of a single non-array variable of such type with a brace-or-equals initializer.
Taken from cppreference.
This means you can only do a switch case on an integer or enum type. For the compiler to be able implicitly convert Wrapper to integer / enum type you need to remove the explicit keyword :
The explicit specifier specifies that a constructor or conversion function (since C++11) doesn't allow implicit conversions
You can also cast Wrapper to int type.
Edit to adress @acraig5075 remarks :
You must be careful which operator is explicit and which is implicit. If both are implicit the code won't compile because there will be an amibiguity :
struct Wrapper
{
    operator int() { return 0; }
    operator bool() { return true; }    
};
source_file.cpp: In function ‘int main()’: source_file.cpp:12:14:
error: ambiguous default type conversion from ‘Wrapper’
switch (w) {
^ source_file.cpp:12:14: note:   candidate conversion
include ‘Wrapper::operator int()’ and ‘Wrapper::operator bool()’
The only way to remove the ambiguity is to do a cast.
If only one of the operator is explicit, the other one will be chosen for the switch statement :
#include <iostream>
struct Wrapper
{
    explicit operator int() { return 0; }
    operator bool() { return true; }    
};
int main()
{
    Wrapper w;
    if (w) { /** this line compiles **/std::cout << " if is true " << std::endl; }
    switch (w) { 
        case 0:
            std::cout << "case 0" << std::endl;
            break;
        case 1:
            std::cout << "case 1" << std::endl;
            break;
    }
    return 0;
}
Output :
 if is true 
case 1
w has been implicitly converted to 1 (true) (because operator int is explicit) and case 1 is executed.
On the other hand :
struct Wrapper
{
    operator int() { return 0; }
    explicit operator bool() { return true; }    
};
Ouput :
 if is true 
case 0
w has been implicitly converted to 0 because operator bool is explicit.
In both case, the if statement is true because w is evaluated contextually to a boolean inside the if-statement.