Issue 1:
In [48]: s = pd.Series([np.NaN, 'hello world'])

In [49]: s
Out[49]:
0 NaN
1 hello world
dtype: object

In [50]: s.fillna([])
Out[50]:
0 NaN
1 hello world
dtype: object

In [51]: s.fillna(['not empty'])
Out[51]:
0 not empty
1 hello world
dtype: object

Had a quick peak in the code and it looks like a numpy issue (1.6.2)

In [52]: a = np.array([np.NaN, 'hello world'])

In [53]: m = np.array([True, False])

In [54]: a[m] = []

In [55]: a
Out[55]:
array(['nan', 'hello world'],
dtype='|S11')

In [56]: a[m] = ['not empty']

In [57]: a
Out[57]:
array(['not empty', 'hello world'],
dtype='|S11')

similar issue when using operators supporting fill_value

In [58]: s1 = pd.Series([np.NaN, [1,2], [10, 20]])

In [59]: s2 = pd.Series([[3,4], np.NaN, [30, 40]])

In [60]: s1.add(s2, fill_value=[])

...
TypeError: unsupported operand type(s) for +: 'float' and 'list'

Did not try for DataFrame, but i suppose this will be the same.

Issue 2:
Should raise on a passed list to value

The results from the fillna() method are very strange when the value parameter is given a list.

For example, using a simple example DataFrame:

df = pandas.DataFrame({'A': [numpy.nan, 1, 2], 'B': [10, numpy.nan, 12], 'C': [[20, 21, 22], [23, 24, 25], numpy.nan]})

df

A B C

0 NaN 10 [20, 21, 22]

1 1 NaN [23, 24, 25]

2 2 12 NaN

df.fillna(value=[100, 101, 102])

A B C

0 100 10 [20, 21, 22]

1 1 101 [23, 24, 25]

2 2 12 102

So it appears the values in the list are used to fill the 'holes' in order, if the list has the same length as number of holes. But if the the list is shorter than the number of holes, the behavior changes to using only the first value in the list:

df.fillna(value=[100, 101])

A B C

0 100 10 [20, 21, 22]

1 1 100 [23, 24, 25]

2 2 12 100

If the list is longer than the number of holes, you get something even more odd:

df.fillna(value=[100, 101, 102, 103])

A B C

0 100 10 [20, 21, 22]

1 1 100 [23, 24, 25]

2 2 12 102

If you specify provide a dict that specifies the fill values by column, the values from the list are used within that column only:

df.fillna(value={'C': [100, 101]})

A B C

0 NaN 10 [20, 21, 22]

1 1 NaN [23, 24, 25]

2 2 12 100

Since it's not always practical to know the number of NaN values a priori, or to customize the length of the value list to match it, this is problematic. Furthermore, some desired values get over-interpreted and cannot be used:

For example, if you want to actually replace all NaN instances in a single column with the same list (either empty or non-empty), I can't figure out how to do it:

df.fillna(value={'C': [[100,101]]})

A B C

0 NaN 10 [20, 21, 22]

1 1 NaN [23, 24, 25]

2 2 12 100

Indeed, if you specify the empty list nothing is filled:

df.fillna(value={'C': list()})

A B C

0 NaN 10 [20, 21, 22]

1 1 NaN [23, 24, 25]

2 2 12 NaN

But a dict works fine:

f.fillna(value={'C': {0: 1}})

A B C

0 NaN 10 [20, 21, 22]

1 1 NaN [23, 24, 25]

2 2 12 {0: 1}

df.fillna(value={'C': dict()})

A B C

0 NaN 10 [20, 21, 22]

1 1 NaN [23, 24, 25]

2 2 12 {}

So it appears the fillna() is making a lot of decisions about how the fill values should be applied, and certain desired outcomes can't be achieved because it's being too 'clever'.