The following piece of code will always return true unless the variable v is null:
v is dynamic
and the following
Firstly, you need to separate the variable and the object. A variable is dynamic if it is defined as dynamic. That is all. There is nothing more. A field or property would be annotated with the [Dynamic] attribute, i.e.
public dynamic Foo {get;set;}
is actually:
[Dynamic]
public object Foo {get;set;}
This basically acts as a prompt for the compiler to access the object via the dynamic API rather than via the OOP API.
An object supports full dynamic capabilities if it implements IDynamicMetaObjectProvider - however, such an object can be accessed via both the dynamic API and via the regular OOP API (it can have both). Equally, an object that doesn't implement IDynamicMetaObjectProvider can be accessed via either API (but: only the public members will be available via dynamic).