Are you trying to animate the Fill property using ColorAnimation, but this property, in the case of casting the circle a solid color, it contains a SolidColorBrush. In turn SolidColorBrush contains a Color property, which you can animate using ColorAnimation.
Here is Your corrected example:
<ellipse width="50" height="50" fill="#fff">
<ellipse.triggers>
<eventtrigger routedevent="Ellipse.Loaded">
<beginstoryboard>
<storyboard>
<coloranimation storyboard.targetproperty="(Ellipse.Fill).(SolidColorBrush.Color)" to="Yellow" duration="0:0:3" repeatbehavior="Forever" autoreverse="True">
</coloranimation></storyboard>
</beginstoryboard>
</eventtrigger>
</ellipse.triggers>
</ellipse>
Example with a blinking circle:
<ellipse width="50" height="50" fill="White">
<ellipse.triggers>
<eventtrigger routedevent="Ellipse.Loaded">
<beginstoryboard>
<storyboard>
<coloranimationusingkeyframes storyboard.targetproperty="(Ellipse.Fill).(SolidColorBrush.Color)" repeatbehavior="Forever" fillbehavior="Stop">
<discretecolorkeyframe value="Red" keytime="0:0:3">
<discretecolorkeyframe value="White" keytime="0:0:3.1">
</discretecolorkeyframe></discretecolorkeyframe></coloranimationusingkeyframes>
</storyboard>
</beginstoryboard>
</eventtrigger>
</ellipse.triggers>
</ellipse>
Explanation on the second example:
ColorAnimationUsingKeyFrames animation color using keyframes on the timeline.
The property
FillBehavior="Stop" returns the object to its original state after the animation.
DiscreteColorKeyFrame — key frame animation of colors without smooth transitions between frames.
The property
Value specifies the desired value for the animated property (in this case, this property — Fill).
The property
KeyTime specifies the position of the keyframe on the timeline.
The KeyTime property of the second key frame of the animation specifies the extent of red. In this example the duration is set to 100ms, because the second key frame is activated via 100 MS after the first.