Inconsistent behavior for 2D Groupby with Categorical MultiIndex raises TypeError with observed=False
#### Code Sample, a copy-pastable example if possible

```python
x = np.random.normal(size=1000)
y = np.random.normal(size=1000)
z = pd.Series(np.full_like(x, 1))
xc = pd.cut(x, 10)
yc = pd.cut(y, 10)
cut = pd.DataFrame({"x": xc, "y": yc})

mi = pd.MultiIndex.from_frame(cut)
z.index = mi
```

#### Problem description
When I run the following, I get an expected result.

```python
>>> z.groupby(["x", "y"], observed=True).count()

x                 y               
(-3.945, -3.223]  (0.795, 1.448]      1
(-3.223, -2.509]  (0.142, 0.795]      1
                  (0.795, 1.448]      1
(-2.509, -1.795]  (-2.47, -1.817]     1
                  (-1.817, -1.164]    4
                                     ..
(1.775, 2.489]    (2.754, 3.407]      1
(2.489, 3.203]    (-0.511, 0.142]     1
                  (0.795, 1.448]      1
                  (1.448, 2.101]      1
                  (2.101, 2.754]      1
Length: 65, dtype: int64
```


However, if I want to preserve the categories that are not observed as in either of the two following, I get a `TypeError` that appears to be due to the inclusion of empty groups (mixing of NaNs and Categoricals?)

```python
z.groupby(["x", "y"]).count()
```

```python
z.groupby(["x", "y"], observed=False).count()
```

```python
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-153-f64fa4f78c55> in <module>
----> 1 z.groupby(["x", "y"]).count()

~/.conda/envs/test_env/lib/python3.7/site-packages/pandas/core/groupby/generic.py in count(self)
    797             dtype="int64",
    798         )
--> 799         return self._reindex_output(result, fill_value=0)
    800 
    801     def _apply_to_column_groupbys(self, func):

~/.conda/envs/test_env/lib/python3.7/site-packages/pandas/core/groupby/groupby.py in _reindex_output(self, output, fill_value)
   2488         levels_list = [ping.group_index for ping in groupings]
   2489         index, _ = MultiIndex.from_product(
-> 2490             levels_list, names=self.grouper.names
   2491         ).sortlevel()
   2492 

~/.conda/envs/test_env/lib/python3.7/site-packages/pandas/core/indexes/multi.py in from_product(cls, iterables, sortorder, names)
    551 
    552         codes = cartesian_product(codes)
--> 553         return MultiIndex(levels, codes, sortorder=sortorder, names=names)
    554 
    555     @classmethod

~/.conda/envs/test_env/lib/python3.7/site-packages/pandas/core/indexes/multi.py in __new__(cls, levels, codes, sortorder, names, dtype, copy, name, verify_integrity, _set_identity)
    278 
    279         if verify_integrity:
--> 280             new_codes = result._verify_integrity()
    281             result._codes = new_codes
    282 

~/.conda/envs/test_env/lib/python3.7/site-packages/pandas/core/indexes/multi.py in _verify_integrity(self, codes, levels)
    366 
    367         codes = [
--> 368             self._validate_codes(level, code) for level, code in zip(levels, codes)
    369         ]
    370         new_codes = FrozenList(codes)

~/.conda/envs/test_env/lib/python3.7/site-packages/pandas/core/indexes/multi.py in <listcomp>(.0)
    366 
    367         codes = [
--> 368             self._validate_codes(level, code) for level, code in zip(levels, codes)
    369         ]
    370         new_codes = FrozenList(codes)

~/.conda/envs/test_env/lib/python3.7/site-packages/pandas/core/indexes/multi.py in _validate_codes(self, level, code)
    302         to a level with missing values (NaN, NaT, None).
    303         """
--> 304         null_mask = isna(level)
    305         if np.any(null_mask):
    306             code = np.where(null_mask[code], -1, code)

~/.conda/envs/test_env/lib/python3.7/site-packages/pandas/core/dtypes/missing.py in isna(obj)
    124     Name: 1, dtype: bool
    125     """
--> 126     return _isna(obj)
    127 
    128 

~/.conda/envs/test_env/lib/python3.7/site-packages/pandas/core/dtypes/missing.py in _isna_old(obj)
    181         return False
    182     elif isinstance(obj, (ABCSeries, np.ndarray, ABCIndexClass, ABCExtensionArray)):
--> 183         return _isna_ndarraylike_old(obj)
    184     elif isinstance(obj, ABCGeneric):
    185         return obj._constructor(obj._data.isna(func=_isna_old))

~/.conda/envs/test_env/lib/python3.7/site-packages/pandas/core/dtypes/missing.py in _isna_ndarraylike_old(obj)
    281         else:
    282             result = np.empty(shape, dtype=bool)
--> 283             vec = libmissing.isnaobj_old(values.ravel())
    284             result[:] = vec.reshape(shape)
    285 

TypeError: Argument 'arr' has incorrect type (expected numpy.ndarray, got Categorical)
```

#### Expected Output

The expected output should preserve non-observed groups and return a result.
```python
x                 y               
(-3.945, -3.223]  (0.795, 1.448]      1
(-3.223, -2.509]  (0.142, 0.795]      1
                  (0.795, 1.448]      1
(-2.509, -1.795]  (-2.47, -1.817]     1
                  (-1.817, -1.164]    4
                                     ..
(1.775, 2.489]    (2.754, 3.407]      1
(2.489, 3.203]    (-0.511, 0.142]     1
                  (0.795, 1.448]      1
                  (1.448, 2.101]      1
                  (2.101, 2.754]      1
Length: 65, dtype: int64
```

#### Output of ``pd.show_versions()``

<details>

[paste the output of ``pd.show_versions()`` here below this line]

INSTALLED VERSIONS
------------------
commit           : None
python           : 3.7.6.final.0
python-bits      : 64
OS               : Linux
OS-release       : 3.10.0-1062.4.3.el7.x86_64
machine          : x86_64
processor        : x86_64
byteorder        : little
LC_ALL           : None
LANG             : en_US.UTF-8
LOCALE           : en_US.UTF-8

pandas           : 1.0.1
numpy            : 1.18.1
pytz             : 2019.3
dateutil         : 2.8.1
pip              : 20.0.2
setuptools       : 45.2.0.post20200210
Cython           : None
pytest           : 5.3.5
hypothesis       : 5.5.4
sphinx           : 2.4.0
blosc            : None
feather          : None
xlsxwriter       : None
lxml.etree       : 4.5.0
html5lib         : None
pymysql          : None
psycopg2         : None
jinja2           : 2.11.1
IPython          : 7.12.0
pandas_datareader: None
bs4              : 4.8.2
bottleneck       : 1.3.1
fastparquet      : None
gcsfs            : None
lxml.etree       : 4.5.0
matplotlib       : 3.1.3
numexpr          : 2.7.1
odfpy            : None
openpyxl         : None
pandas_gbq       : None
pyarrow          : None
pytables         : None
pytest           : 5.3.5
pyxlsb           : None
s3fs             : None
scipy            : 1.4.1
sqlalchemy       : 1.3.13
tables           : 3.6.1
tabulate         : None
xarray           : None
xlrd             : None
xlwt             : None
xlsxwriter       : None
numba            : None

</details>
